package com.ssy.lingxi.member.merchant.service.web;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.api.model.constant.MemberProcessTypeEnum;
import com.ssy.lingxi.member.merchant.entity.MemberRelationDO;
import com.ssy.lingxi.member.merchant.entity.RoleDO;
import com.ssy.lingxi.member.merchant.model.bo.ProcessBO;
import com.ssy.lingxi.member.merchant.model.vo.basic.request.NamePageVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.request.RoleIdPageVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.BaseMemberProcessVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.MemberConfigGroupVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.MemberConfigNameVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.RoleManageVO;
import com.ssy.lingxi.member.merchant.model.vo.validate.request.*;
import com.ssy.lingxi.member.merchant.model.vo.validate.response.MemberProcessQueryVO;
import com.ssy.lingxi.member.merchant.model.vo.validate.response.MemberProcessVO;
import org.springframework.http.HttpHeaders;

import java.util.List;

/**
 * 会员管理流程规则配置相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-05-14
 */
public interface IMemberProcessRuleService {
    /**
     * 分页查询会员流程规则配置列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberProcessQueryVO>> pageMemberProcessRules(HttpHeaders headers, NamePageVO pageVO);

    /**
     * 查询入库流程、变更流程列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<List<BaseMemberProcessVO>> listBaseMemberProcesses(HttpHeaders headers);

    /**
     * 查询角色列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<RoleManageVO>> pageRoles(HttpHeaders headers, NamePageVO pageVO);

    /**
     * 查询角色列表
     * @param loginUser 登录会员信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<RoleManageVO>> pageRoles(UserLoginCacheDTO loginUser, NamePageVO pageVO);

    /**
     * 查询平台默认注册资料
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberConfigNameVO>> pageRoleConfigDetail(HttpHeaders headers, RoleIdPageVO pageVO);

    /**
     * 选择注册资料
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberConfigNameVO>> pageConfigDetail(HttpHeaders headers, RoleIdPageVO pageVO);

    /**
     * 预览注册资料
     * @param headers Http头部信息
     * @param previewVO 接口参数
     * @return 预览结果
     */
    Wrapper<List<MemberConfigGroupVO>> previewMemberDepositoryDetails(HttpHeaders headers, MemberProcessPreviewVO previewVO);

    /**
     * 新增流程规则配置
     * @param headers Http头部信息
     * @param addVO 接口参数
     * @return 新增结果
     */
    Wrapper<Void> addMemberProcessRule(HttpHeaders headers, MemberProcessAddVO addVO);

    /**
     * 修改流程规则配置
     * @param headers Http头部信息
     * @param updateVO 接口参数
     * @return 修改结果
     */
    Wrapper<Void> updateMemberProcessRule(HttpHeaders headers, MemberProcessUpdateVO updateVO);

    /**
     * 查询流程规则配置详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<MemberProcessVO> getMemberProcessRule(HttpHeaders headers, MemberProcessIdVO idVO);

    /**
     * 分页查询流程规则配置关联的入库资料
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberConfigNameVO>> pageMemberProcessDepositDetails(HttpHeaders headers, MemberProcessDepositDetailPageVO pageVO);

    /**
     * 修改流程规则状态
     * @param headers Http头部信息
     * @param statusVO 接口参数
     * @return 修改结果
     */
    Wrapper<Void> updateMemberProcessRuleStatus(HttpHeaders headers, MemberProcessIdAndStatusVO statusVO);

    /**
     * 删除流程规则
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 删除结果
     */
    Wrapper<Void> deleteMemberProcessRule(HttpHeaders headers, MemberProcessIdVO idVO);

    /**
     * 查找流程ProcessKey，如上级会员没有配置，返回默认的流程规则
     * @param relationDO 会员关系
     * @param processTypeEnum 流程类型枚举
     * @return 流程ProcessKey
     */
    ProcessBO findMemberProcessKey(MemberRelationDO relationDO, MemberProcessTypeEnum processTypeEnum);


    /**
     * 查找流程ProcessKey，如上级会员没有配置，返回默认的流程规则
     * @param memberId 上级会员Id
     * @param roleId 下级会员Id
     * @param subRole 下级会员角色
     * @param processTypeEnum 流程类型枚举
     * @return 流程ProcessKey
     */
    ProcessBO findMemberProcessKey(Long memberId, Long roleId, RoleDO subRole, MemberProcessTypeEnum processTypeEnum);

    /**
     * 下级会员角色是否存在非空的入库资料配置
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @param subRoles  下级会员角色列表
     * @return 是/否
     */
    boolean existDepositoryConfig(Long memberId, Long roleId, List<RoleDO> subRoles);
}
